package main

import "fmt"

/*
select关键字可以让goroutine监听多个channel上的数据流动
select默认是阻塞的，只有当监听的channel中有发送或接收可以进行时才会运行
当多个channel都准备好时，select随机选择一个执行
*/

func fibonacci2(ch, quitCh chan int) {
	x, y := 1, 1
	//定义死循环
	for {
		select {
		case ch <- x: //监听ch通道数据，并不断计算斐波那契数并写入通道ch
			x, y = y, x+y
		case <-quitCh: //监听quitCh通道数据，当有goroutine读写通道quitCh时结束循环
			fmt.Println("quit")
			return
			//default: //当写了default分支，select不在阻塞等待channel，而是直接执行default
			//	fmt.Println("default")
		}
	}
}

func main() {
	ch := make(chan int)
	quitCh := make(chan int)
	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println(<-ch) //从ch通道连续读取10次
		}
		quitCh <- 0 //向quitCh通道写入一次
	}()
	fibonacci2(ch, quitCh)
}
